\chapter{Сети}
\pagenumbering{arabic}

\section{Швейцарский нож для сетей - netcat}
Простая и очень нужная утилита, способная передавать данные по сети. Утилита netcat (или nc) должна быть в любом дистрибутиве, и даже в Knoppix она тоже есть. 

Идея netcat очень проста: он просто перенаправляет поток данных в порт сетевого устройства, а на другом конце поток перенаправляется в файл. Отсюда и название: NETcat - тот же cat, но сетевой. При передаче файлов следует первым запускать nc на сервере (куда будут передаваться данные), а потом уже с клиента (откуда передаются данные) пересылать файлы.

\subsection{На стороне сервера (куда передаём данные)}
Нужно запустить netcat так, чтобы он слушал определённый порт, и перенаправлял получаемый поток в файл. Вот так:

\begin{lstlisting}
$ nc -l -p 3333 > file.txt
\end{lstlisting}

Это откроет на прослушивание порт 3333, и сохранит полученные данные в файл file.txt в текущем каталоге. При этом программа не вернёт управление консоли, и будет ждать, пока вы вручную завершите её.


\subsection{На стороне клиента (откуда передаются данные)}:
Для этого передаём по конвейеру файл nc так:

\begin{lstlisting}
$ cat file.txt | nc 192.168.1.1 3333
\end{lstlisting}

Это передаст файл file.txt на машину с IP-адресом 192.168.1.1, где уже запущен nc, слушающий порт 3333.

Можно с помощью nc устроить чат с пользователем на другой машине. Со стороны клиента просто пишете

\begin{lstlisting}
$ nc 192.168.1.1 3333
\end{lstlisting}

и на том конце будет видно всё, что вы печатаете, в том числе кириллицу.


\section{Настройка сетевого интерфейса в Linux}
\subsection{Текущие настройки сетевой карты в Linux}
В консоли с привилегиями рута команду:

\begin{lstlisting}
# ifconfig
\end{lstlisting}
или
\begin{lstlisting}
$ sudo ifconfig
\end{lstlisting}

В результате в консоль будет выдано что-то вроде:

\begin{lstlisting}
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:104 errors:0 dropped:0 overruns:0 frame:0
TX packets:104 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:9387 (9.1 KiB) TX bytes:9387 (9.1 KiB)

eth0 Link encap:Ethernet HWaddr 00:0A:E4:53:AA:2D
inet addr:192.168.1.5 Bcast:192.168.1.255 
Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:21 Base address:0x2c00
\end{lstlisting}

Отсюда видно, что настроены два сетевых интерфейса: петлевой (loopback) под названием lo, и обычная сетевая карта (которая Ethernet) называемая eth0. Причём если в интерфейс eth0 вставлен сетевой провод, идущий в свитч, будет написано RUNNING

Простая настройка сетевого интерфейса возможна командой:

\begin{lstlisting}
# ifconfig eth0 192.168.1.5
\end{lstlisting}


Чтобы заглушить сетевой интерфейс, набираем:

\begin{lstlisting}
# ifdown eth0
\end{lstlisting}

\subsection{Настройка сетевого соединения в Линукс}
Для этого потребуются права администратора и текстовый редактор. Так же нужно представлять, какой IP-адрес следует присвоить сетевой карте, адрес шлюза и прочие параметры.

Сначала нужно выяснить, как называется сетевой интерфейс, соответствующий вашей сетевой карте. Делается это так: в консоли пишем

\begin{lstlisting}
$ dmesg | grep -i Eth
\end{lstlisting}

В результате должны получить что-то вроде (выделение моё):

\begin{lstlisting}
    8139too Fast Ethernet driver 0.9.28
    eth0: RealTek RTL8139 at 0xdf822c00, 
00:15:f2:51:ad:da, IRQ 21
    eth0: Identified 8139 chip type 'RTL-8101'
\end{lstlisting}

Так, похоже, что называется он eth0 (потому, что ethernet, 0 - нулевое устройство - довольно логично). В этом примере дальше будет предполагаться, что интерфейс - eth0.


\subsection{Настройка сетевого соединения со статическим IP}
Для этого следует отредактировать файл:

\begin{lstlisting}
# nano /etc/network/interfaces
\end{lstlisting}
или
\begin{lstlisting}
$ sudo nano /etc/network/interfaces
\end{lstlisting}

Перед тем, как его править, следует решить, какой IP-адрес назначается машине. Если вы подключаетесь к уже настроенной сети - хорошо бы посмотреть, какие настройки есть там. Например, если подключение происходит к CorvettTelecom, настройки вам дадут. Если же сеть самопальная, например из двух компьютеров, нижеследующий пример подойдёт.

В общем, при назначении статических адресов нужно указать: IP-адрес (address), маску подсети (netmask) и адрес шлюза (gateway). Для локальной сети файл /etc/network/interfaces нужно изменить так:

\begin{lstlisting}
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.1.5
netmask 255.255.255.0
gateway 192.168.1.1
\end{lstlisting}

В этом примере назначен IP-адрес 192.168.1.5.

\subsection{Настройка сетевого соединения с динамическим IP}
Редактируем тот же файл, отвечающий в Линукс за сетевые настройки:

\begin{lstlisting}
# nano /etc/network/interfaces
\end{lstlisting}
или
\begin{lstlisting}
$ sudo nano /etc/network/interfaces
\end{lstlisting}

Здесь всё проще: нужно лишь привести файл к виду:

\begin{lstlisting}
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
\end{lstlisting}

Так же можно настроить и из консоли:

\begin{lstlisting}
#dhcpcd eth0
\end{lstlisting}

Для этого в системе должен быть установлен пакет dhcp3-client

\subsection{Два слова о беспроводных сетях}
Чтобы изменить тип интерфейса

\begin{lstlisting}
# wlanconfig ath0 destroy
# wlanconfig ath0 create wlandev wifi0
# wlanmode adhoc
\end{lstlisting}

Для того, чтобы посмотреть список сетей, набираем:

\begin{lstlisting}
# iwlist ath0 scan
\end{lstlisting}
или
\begin{lstlisting}
# wlanconfig ath0 list ap
\end{lstlisting}

Если есть открытая сеть и нужно к ней подключиться, набираем от рута:

\begin{lstlisting}
# iwconfig ath0 essid SomeESSID
\end{lstlisting}

Для того, чтобы соединение шифровалось с использованием WEP, пишем:

\begin{lstlisting}
# iwconfig ath0 key ...
\end{lstlisting}

\subsection{Настройка адресов серверов имён (DNS, nameserver)}
Если вы не настроите это, то сможете подключаться к ресурсам сети только по IP-адресам, что несколько неудобно. Для того, чтобы в Линукс прописать адреса серверов имён (DNS address), нужно отредактировать файл /etc/resolv.conf или создать его, если его нет.

\begin{lstlisting}
# nano /etc/resolv.conf
\end{lstlisting}
или
\begin{lstlisting}
$ sudo nano /etc/resolv.conf
\end{lstlisting}

И прописать адреса следующим образом:

\begin{lstlisting}
nameserver 192.168.1.1
nameserver 192.168.2.1
\end{lstlisting}

столько, сколько их нужно. Слово nameserver добавлять обязательно.

% % Лицензия на материалы этого текст
% 
% Материалы сайта "Записки дебианщика" написаны virens и доступны на условиях лицензии Creative Commons Attribution-Non-Commercial-Share Alike 3.0 Unported License. Вы можете копировать, распространять, показывать эту работу, и создавать производные работы в некоммерческих целях на условиях:
% 
% 1) обязательной ссылки на автора (virens, http://mydebianblog.blogspot.com/) и
% 
% 2) распространении любых производных работ на условиях этой же лицензии (ссылка на эту лицензию 
% обязательна!).
% 
% Пожалуйста соблюдайте условия лицензии.
% 
% This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License. 
Чтобы изменения настройки сетевых интерфейсов вступили в силу, следует дать команду:

\begin{lstlisting}
# /etc/init.d/networking restart
\end{lstlisting}
или
\begin{lstlisting}
$ sudo /etc/init.d/networking restart
\end{lstlisting}

Всё, после этого настойки вступают в силу для всех сетевых интерфейсов.


\section{Как узнать MAC адрес сетевой карты}
\subsection{Временная смена MAC-адреса в Linux}
Для этого набираем
\begin{lstlisting}
$ sudo ifconfig eth0 hw ether xx:xx:xx:xx
\end{lstlisting}

при этом MAC-адрес изменится и будет оставаться таковым до перезагрузки. Если нужно сделать так, чтобы MAC-адрес был таким всегда, нужно приударить в соответствующий бубен системный конфиг.

\subsection{Постоянный изменённый MAC-адрес в Linux}
Для этого идём в /etc/network/if-pre-up.d/ и создаём там от рута файл, например имени pre-up.

В этот файл пишем следующее:
% % Лицензия на материалы этого текст
% 
% Материалы сайта "Записки дебианщика" написаны virens и доступны на условиях лицензии Creative Commons Attribution-Non-Commercial-Share Alike 3.0 Unported License. Вы можете копировать, распространять, показывать эту работу, и создавать производные работы в некоммерческих целях на условиях:
% 
% 1) обязательной ссылки на автора (virens, http://mydebianblog.blogspot.com/) и
% 
% 2) распространении любых производных работ на условиях этой же лицензии (ссылка на эту лицензию 
% обязательна!).
% 
% Пожалуйста соблюдайте условия лицензии.
% 
% This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License. 
\begin{lstlisting}
#! /bin/sh
ifconfig eth0 hw ether 00:00:00:00
\end{lstlisting}

Нули замените своим мак-адресом. Чтобы изменения вступили сразу же, без перезагрузки, даём команду:

\begin{lstlisting}
# /etc/init.d/networking restart
\end{lstlisting}

При этом в первый раз (особенно при работающем интерфейсе) может вылезти такое:

\begin{lstlisting}
# /etc/init.d/networking restart
Setting up IP spoofing protection: rp_filter.
Reconfiguring network interfaces...
SIOCDELRT: No such process
ifup: interface lo already configured
SIOCSIFHWADDR: Device or resource busy
run-parts: /etc/network/if-pre-up.d/pre-up 
exited with return code 1
done.
\end{lstlisting}

Повторяем команду, на этот раз всё должно быть без шума и пыли:

%Опять hostname:path# ? (imposeren)
\begin{lstlisting}
notebeast:/home/beast# /etc/init.d/networking restart
Setting up IP spoofing protection: rp_filter.
Reconfiguring network interfaces...ifup: 
interface lo already configured
done.
\end{lstlisting}

Всё, MAC изменён и останется таковым и после перезагрузки.

\subsection{Другие способы смены MAC адреса}
Сменить MAC-адрес в Линукс можно разными способами - на то он и Линукс. Например, можно заменить содержимое /etc/network/interfaces на следующее:

\begin{lstlisting}
# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp
hwaddress ether 00:00:00:00:00:00
\end{lstlisting}

Нули, как и ранее, заменяем на требуемый MAC-address. В Debian всё проще: в описание интерфейса в /etc/network/interfaces добавляем:

\begin{lstlisting}
hwaddress ether XX:XX:XX:XX:XX:XX
\end{lstlisting}

Другие способы описаны в комментариях к этому посту ниже.

\subsection{Узнать MAC-адрес сетевой карты в Linux}
Чтобы узнать текущий MAC-адрес просто: набираем

\begin{lstlisting}
$ sudo ifconfig
\end{lstlisting}

И видим нечто вроде:

\begin{lstlisting}
eth0 Link encap:Ethernet 
HWaddr 00:0A:E4:53:AA:2D
inet addr:10.26.49.77 Bcast:10.26.63.255 
Mask:255.255.240.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:208554 errors:0 dropped:0 
overruns:0 frame:0
TX packets:125071 errors:0 dropped:0 
overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:40664531 (38.7 MiB) 
TX bytes:45919980 (43.7 MiB)
Interrupt:21 Base address:0x4c00

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:18511 errors:0 dropped:0 
overruns:0 frame:0
TX packets:18511 errors:0 dropped:0 
overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:537155 (524.5 KiB) 
TX bytes:537155 (524.5 KiB)
\end{lstlisting}

Красное полужирное выделение и есть MAC-адрес (в данном случае, сетевой карты моего ноутбука).


\section{Настройка и использование SSH в Linux}
\subsection{Установка SSH в Linux на примере Debian}
Итак, всё, что нам нужно для установки полного комплекта удалённого управления компьютером (SSH-клиент и SSH-сервер) давным-давно лежит в репозитории. Лёгким движением ставим пакет:

\begin{lstlisting}
# apt-get install ssh
\end{lstlisting}

и ждём несколько мгновений, когда оно настроится. После этого мы получим возможность SSH доступа в систему и управления ей. Так как технология эта кросс-платформенная, то можно управлять по SSH Linux или FreeBSD можно и из Windows. Для этого есть putty, SSH Windows клиент.

\subsection{На стороне клиента}
Теперь надо поправить настройки, которые лежат в каталоге /etc/ssh - конфиг для клиента называется ssh-config, конфиг для сервера, соответственно, sshd-config. На своей, клиентской, стороне, настраиваем возможность приёма X11Forward, ищем и меняем ключи на:

\begin{lstlisting}
ForwardX11 yes
ForwardX11Trusted yes
\end{lstlisting}

Клиентская машина теперь может запускать удалённо графические приложения на сервере. Настройка SSH на стороне клиента закончена, теперь идём к админу далёкого сервера...
В принципе, можно на клиентской стороне ничего не менять, а логиниться на удалённую машину так:

\begin{lstlisting}
$ ssh -X user@server1.mydomain.com
\end{lstlisting}
или
\begin{lstlisting}
$ ssh -X user@192.168.x.x
\end{lstlisting}

если лезть в конфиги на своей стороне не хочется, но у меня это почему-то не работало.

\subsection{На стороне сервера}
Теперь нужно настроить SSH сервер: в конфигах машины-сервера, к которой будем подсоединяться (у вас ведь есть её рутовый пароль, так ведь?) в /etc/ssh/sshd-config ищем и меняем ключи на:

\begin{lstlisting}
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes
\end{lstlisting}

Этим мы разрешаем серверу запускать удалённо графические приложения и отправлять их на клиентскую машину. Перестартуем сервис:

\begin{lstlisting}
$ sudo /etc/init.d/ssh restart
\end{lstlisting}

Теперь мы сможем заходить на машину не только в консольном режиме, но и с запуском иксовых приложений.

Если хочется разрешить вход только с определённых машин, нужно подправить строки в конфиге \verb+/etc/ssh/sshd_config+

\begin{lstlisting}
AllowUsers hacker@*

AllowUsers *@192.168.1.*
\end{lstlisting}

Впрочем, это уже для более продвинутых товарищей.


\subsection{SSH в действии}
Всё готово, и теперь я приведу несколько команд SSH для примера. Открываем консольку и пишем в ней:

\begin{lstlisting}
$ ssh %имя\_пользователя\_удалённой\_машины@ip\_адрес% %\_или\_сетевое\_имя\_удалённой\_машины%
\end{lstlisting}

Например, в моём случае, когда я захожу удалённо на ноутбук, пишу ssh beast@192.168.1.5 - так как у меня не настроен сервер имён, пишу адреса. Опять-таки, доступ по SSH может быть не только из Linux или FreeBSD, но и из Windows - при помощи putty.


